/*
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 *
 * Permission to use, copy, modify, and distribute this software and
 * its documentation is hereby granted, provided that the above
 * copyright notice appears in all copies.
 *
 * SUN MAKES NO REPRESENTATION OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT.  SUN SHALL NOT BE LIABLE
 * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
 * MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES
 *
 * This file has been altered from its original by Sun Microsystems to
 * fit local coding style.
 */

#ifndef	_ZLIB_H
#define	_ZLIB_H

#ifdef __cplusplus
extern "C" {
#endif

/*	$Id: zlib.h,v 1.7 1997/11/27 06:03:33 paulus Exp $	*/

/*
 * Updated to zlib-1.1.3 by James Carlson.
 *
 * This file is derived from zlib.h and zconf.h from the zlib-1.0.4
 * distribution by Jean-loup Gailly and Mark Adler, with some additions
 * by Paul Mackerras to aid in implementing Deflate compression and
 * decompression for PPP packets.
 */

/*
 *  ==FILEVERSION 971127==
 *
 * This marker is used by the Linux installation script to determine
 * whether an up-to-date version of this file is already installed.
 */


/* +++ zlib.h */
/*
 * zlib.h -- interface of the 'zlib' general purpose compression
 * library version 1.1.3, July 9th, 1998
 *
 * Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any
 * damages arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any
 * purpose, including commercial applications, and to alter it and
 * redistribute it freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must
 *    not claim that you wrote the original software. If you use this
 *    software in a product, an acknowledgment in the product
 *    documentation would be appreciated but is not required.
 *
 * 2. Altered source versions must be plainly marked as such, and must
 *    not be misrepresented as being the original software.
 *
 * 3. This notice may not be removed or altered from any source
 *    distribution.
 *
 *
 * Jean-loup Gailly        Mark Adler
 * jloup@gzip.org          madler@alumni.caltech.edu
 *
 * The data format used by the zlib library is described by RFCs (Request for
 * Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
 * (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
 */

/* +++ zconf.h */
/*
 * zconf.h -- configuration of the zlib compression library
 * Copyright (C) 1995-1998 Jean-loup Gailly.
 * For conditions of distribution and use, see copyright notice in zlib.h
 */

/* From: zconf.h,v 1.20 1996/07/02 15:09:28 me Exp $ */

/*
 * If you *really* need a unique prefix for all types and library functions,
 * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
 */
#ifdef Z_PREFIX
#define	deflateInit_	z_deflateInit_
#define	deflate		z_deflate
#define	deflateEnd	z_deflateEnd
#define	inflateInit_	z_inflateInit_
#define	inflate		z_inflate
#define	inflateEnd	z_inflateEnd
#define	deflateInit2_	z_deflateInit2_
#define	deflateSetDictionary	z_deflateSetDictionary
#define	deflateCopy	z_deflateCopy
#define	deflateReset	z_deflateReset
#define	deflateParams	z_deflateParams
#define	inflateInit2_	z_inflateInit2_
#define	inflateSetDictionary	z_inflateSetDictionary
#define	inflateSync	z_inflateSync
#define	inflateSyncPoint z_inflateSyncPoint
#define	inflateReset	z_inflateReset
#define	compress	z_compress
#define	compress2	z_compress2
#define	uncompress	z_uncompress
#define	adler32		z_adler32
#define	crc32		z_crc32
#define	get_crc_table	z_get_crc_table

#define	Byte		z_Byte
#define	uInt		z_uInt
#define	uLong		z_uLong
#define	Bytef		z_Bytef
#define	charf		z_charf
#define	intf		z_intf
#define	uIntf		z_uIntf
#define	uLongf		z_uLongf
#define	voidpf		z_voidpf
#define	voidp		z_voidp
#endif

#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
#define	WIN32
#endif
#if defined(WIN32) || defined(__386__) || defined(__i386)
#ifndef __32BIT__
#define	__32BIT__
#endif
#endif
#if defined(__MSDOS__) && !defined(MSDOS)
#define	MSDOS
#endif

/*
 * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
 * than 64k bytes at a time (needed on systems with 16-bit int).
 */
#if defined(MSDOS) && !defined(__32BIT__)
#define	MAXSEG_64K
#endif
#ifdef MSDOS
#define	UNALIGNED_OK
#endif

#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC)
#define	STDC
#endif
#if (defined(__STDC__) || defined(__cplusplus)) || defined(__OS2__)
#ifndef STDC
#define	STDC
#endif
#endif

#ifndef STDC
#ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
#define	const
#endif
#endif

/* Some Mac compilers merge all .h files incorrectly: */
#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
#define	NO_DUMMY_DECL
#endif

/* Old Borland C incorrectly complains about missing returns: */
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
#define	NEED_DUMMY_RETURN
#endif

/* Maximum value for memLevel in deflateInit2 */
#ifndef MAX_MEM_LEVEL
#ifdef MAXSEG_64K
#define	MAX_MEM_LEVEL 8
#else
#define	MAX_MEM_LEVEL 9
#endif
#endif

/*
 * Maximum value for windowBits in deflateInit2 and inflateInit2
 * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
 * created by gzip. (Files created by minigzip can still be extracted by
 * gzip.)
 */
#ifndef MAX_WBITS
#define	MAX_WBITS   15 /* 32K LZ77 window */
#endif

/*
 * The memory requirements for deflate are (in bytes):
 *	1 << (windowBits+2)   +  1 << (memLevel+9)
 *
 * that is: 128K for windowBits=15 + 128K for memLevel = 8 (default
 * values) plus a few kilobytes for small objects.  For example, if
 * you want to reduce the default memory requirements from 256K to
 * 128K, compile with
 *
 *	make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
 *
 * Of course this will generally degrade compression (there's no free lunch).
 *
 * The memory requirements for inflate are (in bytes) 1 << windowBits
 * that is, 32K for windowBits=15 (default value) plus a few kilobytes
 * for small objects.
 */

			/* Type declarations */

#ifndef OF /* function prototypes */
#ifdef STDC
#define	OF(args)  args
#else
#define	OF(args)  ()
#endif
#endif

/*
 * The following definitions for FAR are needed only for MSDOS mixed
 * model programming, small or medium model with some far allocations.
 * This was tested only with MSC; for other MSDOS compilers you may have
 * to define	NO_MEMCPY in zutil.h.  If you don't need the mixed model,
 * just define	FAR to be empty.
 */
#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
	/* MSC small or medium model */
#define	SMALL_MEDIUM
#ifdef _MSC_VER
#define	FAR __far
#else
#define	FAR far
#endif
#endif
#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
#ifndef __32BIT__
#define	SMALL_MEDIUM
#define	FAR __far
#endif
#endif


/* Compile with -DZLIB_DLL for Windows DLL support */
#if defined(ZLIB_DLL)
#if defined(_WINDOWS) || defined(WINDOWS)
#ifdef FAR
#undef FAR
#endif
#include <windows.h>
#define	ZEXPORT  WINAPI
#ifdef WIN32
#define	ZEXPORTVA  WINAPIV
#else
#define	ZEXPORTVA  FAR _cdecl _export
#endif
#endif
#if defined(__BORLANDC__)
#if (__BORLANDC__ >= 0x0500) && defined(WIN32)
#include <windows.h>
#define	ZEXPORT __declspec(dllexport) WINAPI
#define	ZEXPORTRVA __declspec(dllexport) WINAPIV
#else
#if defined(_Windows) && defined(__DLL__)
#define	ZEXPORT _export
#define	ZEXPORTVA _export
#endif
#endif
#endif
#endif

#if defined(__BEOS__)
#if defined(ZLIB_DLL)
#define	ZEXTERN extern __declspec(dllexport)
#else
#define	ZEXTERN extern __declspec(dllimport)
#endif
#endif

#ifndef ZEXPORT
#define	ZEXPORT
#endif
#ifndef ZEXPORTVA
#define	ZEXPORTVA
#endif
#ifndef ZEXTERN
#define	ZEXTERN extern
#endif

#ifndef FAR
#define	FAR
#endif

#if !defined(MACOS) && !defined(TARGET_OS_MAC)
typedef unsigned char  Byte;  /* 8 bits */
#endif
typedef unsigned int   uInt;  /* 16 bits or more */
typedef unsigned long  uLong; /* 32 bits or more */

#ifdef SMALL_MEDIUM
	/* Borland C/C++ ignores FAR inside typedef */
#define	Bytef Byte FAR
#else
	typedef Byte  FAR Bytef;
#endif
typedef char  FAR charf;
typedef int   FAR intf;
typedef uInt  FAR uIntf;
typedef uLong FAR uLongf;

#ifdef STDC
	typedef void FAR	*voidpf;
	typedef void		*voidp;
#else
	typedef Byte FAR	*voidpf;
	typedef Byte		*voidp;
#endif

#ifdef HAVE_UNISTD_H
#include <sys/types.h> /* for off_t */
#include <unistd.h>    /* for SEEK_* and off_t */
#define	z_off_t  off_t
#endif
#ifndef SEEK_SET
#define	SEEK_SET	0	/* Seek from beginning of file.  */
#define	SEEK_CUR	1	/* Seek from current position.  */
#define	SEEK_END	2	/* Set file pointer to EOF plus "offset" */
#endif
#ifndef z_off_t
#define	z_off_t long
#endif

/* MVS linker does not support external names larger than 8 bytes */
#if defined(__MVS__)
#pragma map(deflateInit_, "DEIN")
#pragma map(deflateInit2_, "DEIN2")
#pragma map(deflateEnd, "DEEND")
#pragma map(inflateInit_, "ININ")
#pragma map(inflateInit2_, "ININ2")
#pragma map(inflateEnd, "INEND")
#pragma map(inflateSync, "INSY")
#pragma map(inflateSetDictionary, "INSEDI")
#pragma map(inflate_blocks, "INBL")
#pragma map(inflate_blocks_new, "INBLNE")
#pragma map(inflate_blocks_free, "INBLFR")
#pragma map(inflate_blocks_reset, "INBLRE")
#pragma map(inflate_codes_free, "INCOFR")
#pragma map(inflate_codes, "INCO")
#pragma map(inflate_fast, "INFA")
#pragma map(inflate_flush, "INFLU")
#pragma map(inflate_mask, "INMA")
#pragma map(inflate_set_dictionary, "INSEDI2")
#pragma map(inflate_copyright, "INCOPY")
#pragma map(inflate_trees_bits, "INTRBI")
#pragma map(inflate_trees_dynamic, "INTRDY")
#pragma map(inflate_trees_fixed, "INTRFI")
#pragma map(inflate_trees_free, "INTRFR")
#endif
/* --- zconf.h */

/* +++ zlib.h */
#define	ZLIB_VERSION "1.1.3P"

/*
 *     The 'zlib' compression library provides in-memory compression
 *  and decompression functions, including integrity checks of the
 *  uncompressed data.  This version of the library supports only one
 *  compression method (deflation) but other algorithms may be added
 *  later and will have the same stream interface.
 *
 *     For compression the application must provide the output buffer
 *  and may optionally provide the input buffer for optimization. For
 *  decompression, the application must provide the input buffer and
 *  may optionally provide the output buffer for optimization.
 *
 *     Compression can be done in a single step if the buffers are
 *  large enough (for example if an input file is mmap'ed), or can be
 *  done by repeated calls of the compression function.  In the latter
 *  case, the application must provide more input and/or consume the
 *  output (providing more output space) before each call.
 *
 *     The library does not install any signal handler. It is
 *  recommended to add at least a handler for SIGSEGV when
 *  decompressing; the library checks the consistency of the input
 *  data whenever possible but may go nuts for some forms of corrupted
 *  input.
 */

typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void (*free_func) OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
	Bytef	*next_in;	/* next input byte */
	uInt	avail_in;	/* number of bytes available at next_in */
	uLong	total_in;	/* total nb of input bytes read so far */

	Bytef	*next_out;	/* next output byte should be put there */
	uInt	avail_out;	/* remaining free space at next_out */
	uLong	total_out;	/* total nb of bytes output so far */

	const char *msg;	/* last error message, NULL if no error */
	struct internal_state FAR *state; /* not visible to applications */

	alloc_func	zalloc;	/* used to allocate the internal state */
	free_func	zfree;	/* used to free the internal state */
		/* private data object passed to zalloc and zfree */
	voidpf		opaque;

		/* best guess about the data type: ascii or binary */
	int	data_type;
	uLong	adler;		/* adler32 value of the uncompressed data */
	uLong	reserved;	/* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

/*
 * The application must update next_in and avail_in when avail_in has
 * dropped to zero. It must update next_out and avail_out when
 * avail_out has dropped to zero. The application must initialize
 * zalloc, zfree and opaque before calling the init function. All
 * other fields are set by the compression library and must not be
 * updated by the application.
 *
 * The opaque value provided by the application will be passed as the
 * first parameter for calls of zalloc and zfree. This can be useful
 * for custom memory management. The compression library attaches no
 * meaning to the opaque value.
 *
 * zalloc must return Z_NULL if there is not enough memory for the
 * object.  On 16-bit systems, the functions zalloc and zfree must be
 * able to allocate exactly 65536 bytes, but will not be required to
 * allocate more than this if the symbol MAXSEG_64K is defined (see
 * zconf.h). WARNING: On MSDOS, pointers returned by zalloc for
 * objects of exactly 65536 bytes *must* have their offset normalized
 * to zero. The default allocation function provided by this library
 * ensures this (see zutil.c). To reduce memory requirements and avoid
 * any allocation of 64K objects, at the expense of compression ratio,
 * compile the library with -DMAX_WBITS=14 (see zconf.h).
 *
 * The fields total_in and total_out can be used for statistics or
 * progress reports. After compression, total_in holds the total size
 * of the uncompressed data and may be saved for use in the
 * decompressor (particularly if the decompressor wants to decompress
 * everything in a single step).
 */

			/* constants */

#define	Z_NO_FLUSH	0
#define	Z_PARTIAL_FLUSH	1 /* will be removed, use Z_SYNC_FLUSH instead */
#define	Z_PACKET_FLUSH	2
#define	Z_SYNC_FLUSH	3
#define	Z_FULL_FLUSH	4
#define	Z_FINISH	5
/* Allowed flush values; see deflate() below for details */

#define	Z_OK		0
#define	Z_STREAM_END	1
#define	Z_NEED_DICT	2
#define	Z_ERRNO		(-1)
#define	Z_STREAM_ERROR	(-2)
#define	Z_DATA_ERROR	(-3)
#define	Z_MEM_ERROR	(-4)
#define	Z_BUF_ERROR	(-5)
#define	Z_VERSION_ERROR	(-6)
/*
 * Return codes for the compression/decompression functions. Negative
 * values are errors, positive values are used for special but normal
 * events.
 */

#define	Z_NO_COMPRESSION	0
#define	Z_BEST_SPEED		1
#define	Z_BEST_COMPRESSION	9
#define	Z_DEFAULT_COMPRESSION	(-1)
/* compression levels */

#define	Z_FILTERED	1
#define	Z_HUFFMAN_ONLY	2
#define	Z_DEFAULT_STRATEGY	0
/* compression strategy; see deflateInit2() below for details */

#define	Z_BINARY	0
#define	Z_ASCII	1
#define	Z_UNKNOWN	2
/* Possible values of the data_type field */

#define	Z_DEFLATED	8
/* The deflate compression method (the only one supported in this version) */

#define	Z_NULL	0	/* for initializing zalloc, zfree, opaque */

#define	zlib_version zlibVersion()
/* for compatibility with versions < 1.0.2 */

			/* basic functions */

ZEXTERN const char *ZEXPORT zlibVersion OF((void));
/*
 * The application can compare zlibVersion and ZLIB_VERSION for
 * consistency.  If the first character differs, the library code
 * actually used is not compatible with the zlib.h header file used by
 * the application.  This check is automatically made by deflateInit
 * and inflateInit.
 */

/*
 * ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
 *
 *     Initializes the internal stream state for compression. The
 *     fields zalloc, zfree and opaque must be initialized before by
 *     the caller.  If zalloc and zfree are set to Z_NULL, deflateInit
 *     updates them to use default allocation functions.
 *
 *     The compression level must be Z_DEFAULT_COMPRESSION, or between
 *     0 and 9: 1 gives best speed, 9 gives best compression, 0 gives
 *     no compression at all (the input data is simply copied a block
 *     at a time).  Z_DEFAULT_COMPRESSION requests a default
 *     compromise between speed and compression (currently equivalent
 *     to level 6).
 *
 *     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was
 *     not enough memory, Z_STREAM_ERROR if level is not a valid
 *     compression level, Z_VERSION_ERROR if the zlib library version
 *     (zlib_version) is incompatible with the version assumed by the
 *     caller (ZLIB_VERSION).  msg is set to null if there is no error
 *     message.  deflateInit does not perform any compression: this
 *     will be done by deflate().
 */


ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
/*
 * Performs one or both of the following actions:
 *
 * - Compress more input starting at next_in and update next_in and
 *   avail_in accordingly. If not all input can be processed (because
 *   there is not enough room in the output buffer), next_in and
 *   avail_in are updated and processing will resume at this point for
 *   the next call of deflate().
 *
 * - Provide more output starting at next_out and update next_out and
 *   avail_out accordingly. This action is forced if the parameter flush
 *   is non zero.  Forcing flush frequently degrades the compression
 *   ratio, so this parameter should be set only when necessary (in
 *   interactive applications).  Some output may be provided even if
 *   flush is not set.
 *
 * Before the call of deflate(), the application should ensure that at
 * least one of the actions is possible, by providing more input
 * and/or consuming more output, and updating avail_in or avail_out
 * accordingly; avail_out should never be zero before the call. The
 * application can consume the compressed output when it wants, for
 * example when the output buffer is full (avail_out == 0), or after
 * each call of deflate(). If deflate returns Z_OK and with zero
 * avail_out, it must be called again after making room in the output
 * buffer because there might be more output pending.
 *
 * If the parameter flush is set to Z_PARTIAL_FLUSH, the current
 * compression block is terminated and flushed to the output buffer so
 * that the decompressor can get all input data available so far. For
 * method 9, a future variant on method 8, the current block will be
 * flushed but not terminated.  Z_SYNC_FLUSH has the same effect as
 * partial flush except that the compressed output is byte aligned
 * (the compressor can clear its internal bit buffer) and the current
 * block is always terminated; this can be useful if the compressor
 * has to be restarted from scratch after an interruption (in which
 * case the internal state of the compressor may be lost).  If flush
 * is set to Z_FULL_FLUSH, the compression block is terminated, a
 * special marker is output and the compression dictionary is
 * discarded; this is useful to allow the decompressor to synchronize
 * if one compressed block has been damaged (see inflateSync below).
 * Flushing degrades compression and so should be used only when
 * necessary.  Using Z_FULL_FLUSH too often can seriously degrade the
 * compression. If deflate returns with avail_out == 0, this function
 * must be called again with the same value of the flush parameter and
 * more output space (updated avail_out), until the flush is complete
 * (deflate returns with non-zero avail_out).
 *
 * If the parameter flush is set to Z_PACKET_FLUSH, the compression
 * block is terminated, and a zero-length stored block is output,
 * omitting the length bytes (the effect of this is that the 3-bit
 * type code 000 for a stored block is output, and the output is then
 * byte-aligned).  This is designed for use at the end of a PPP
 * packet.
 *
 * If the parameter flush is set to Z_FINISH, pending input is
 * processed, pending output is flushed and deflate returns with
 * Z_STREAM_END if there was enough output space; if deflate returns
 * with Z_OK, this function must be called again with Z_FINISH and
 * more output space (updated avail_out) but no more input data, until
 * it returns with Z_STREAM_END or an error. After deflate has
 * returned Z_STREAM_END, the only possible operations on the stream
 * are deflateReset or deflateEnd.
 *
 * Z_FINISH can be used immediately after deflateInit if all the
 * compression is to be done in a single step. In this case, avail_out
 * must be at least 0.1% larger than avail_in plus 12 bytes.  If
 * deflate does not return Z_STREAM_END, then it must be called again
 * as described above.
 *
 * deflate() may update data_type if it can make a good guess about
 * the input data type (Z_ASCII or Z_BINARY). In doubt, the data is
 * considered binary. This field is only for information purposes and
 * does not affect the compression algorithm in any manner.
 *
 * deflate() returns Z_OK if some progress has been made (more input
 * processed or more output produced), Z_STREAM_END if all input has
 * been consumed and all output has been produced (only when flush is
 * set to Z_FINISH), Z_STREAM_ERROR if the stream state was
 * inconsistent (for example if next_in or next_out was NULL),
 * Z_BUF_ERROR if no progress is possible.
 */


ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
/*
 * All dynamically allocated data structures for this stream are
 * freed.  This function discards any unprocessed input and does not
 * flush any pending output.
 *
 * deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream
 * state was inconsistent, Z_DATA_ERROR if the stream was freed
 * prematurely (some input or output was discarded). In the error
 * case, msg may be set but then points to a static string (which must
 * not be deallocated).
 */


/*
 * ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
 *
 * Initializes the internal stream state for decompression. The fields
 * zalloc, zfree and opaque must be initialized before by the caller.
 * If zalloc and zfree are set to Z_NULL, inflateInit updates them to
 * use default allocation functions.
 *
 * inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
 * enough memory, Z_VERSION_ERROR if the zlib library version is
 * incompatible with the version assumed by the caller.  msg is set to
 * null if there is no error message. inflateInit does not perform any
 * decompression: this will be done by inflate().
 */


ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
/*
 * Performs one or both of the following actions:
 *
 * - Decompress more input starting at next_in and update next_in and
 *   avail_in accordingly. If not all input can be processed (because
 *   there is not enough room in the output buffer), next_in is
 *   updated and processing will resume at this point for the next
 *   call of inflate().
 *
 * - Provide more output starting at next_out and update next_out and
 *   avail_out accordingly.  inflate() provides as much output as
 *   possible, until there is no more input data or no more space in
 *   the output buffer (see below about the flush parameter).
 *
 * Before the call of inflate(), the application should ensure that at
 * least one of the actions is possible, by providing more input
 * and/or consuming more output, and updating the next_* and avail_*
 * values accordingly.  The application can consume the uncompressed
 * output when it wants, for example when the output buffer is full
 * (avail_out == 0), or after each call of inflate(). If inflate
 * returns Z_OK and with zero avail_out, it must be called again after
 * making room in the output buffer because there might be more output
 * pending.
 *
 * If the parameter flush is set to Z_PARTIAL_FLUSH or Z_PACKET_FLUSH,
 * inflate flushes as much output as possible to the output
 * buffer. The flushing behavior of inflate is not specified for
 * values of the flush parameter other than Z_PARTIAL_FLUSH,
 * Z_PACKET_FLUSH or Z_FINISH, but the current implementation actually
 * flushes as much output as possible anyway.  For Z_PACKET_FLUSH,
 * inflate checks that once all the input data has been consumed, it
 * is expecting to see the length field of a stored block; if not, it
 * returns Z_DATA_ERROR.
 *
 * inflate() should normally be called until it returns Z_STREAM_END
 * or an error. However if all decompression is to be performed in a
 * single step (a single call of inflate), the parameter flush should
 * be set to Z_FINISH. In this case all pending input is processed and
 * all pending output is flushed; avail_out must be large enough to
 * hold all the uncompressed data. (The size of the uncompressed data
 * may have been saved by the compressor for this purpose.) The next
 * operation on this stream must be inflateEnd to deallocate the
 * decompression state. The use of Z_FINISH is never required, but can
 * be used to inform inflate that a faster routine may be used for the
 * single inflate() call.
 *
 * inflate() returns Z_OK if some progress has been made (more input
 * processed or more output produced), Z_STREAM_END if the end of the
 * compressed data has been reached and all uncompressed output has
 * been produced, Z_NEED_DICT if a preset dictionary is needed at this
 * point (see inflateSetDictionary below), Z_DATA_ERROR if the input
 * data was corrupted, Z_STREAM_ERROR if the stream structure was
 * inconsistent (for example if next_in or next_out was NULL),
 * Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no
 * progress is possible or if there was not enough room in the output
 * buffer when Z_FINISH is used. In the Z_DATA_ERROR case, the
 * application may then call inflateSync to look for a good
 * compression block.  In the Z_NEED_DICT case, strm->adler is set to
 * the Adler32 value of the dictionary chosen by the compressor.
 */


ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
/*
 * All dynamically allocated data structures for this stream are
 * freed.  This function discards any unprocessed input and does not
 * flush any pending output.
 *
 * inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream
 * state was inconsistent. In the error case, msg may be set but then
 * points to a static string (which must not be deallocated).
 */

			/* Advanced functions */

/* The following functions are needed only in some special applications. */

/*
 * ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
 *                                    int  level,
 *                                    int  method,
 *                                    int  windowBits,
 *                                    int  memLevel,
 *                                    int  strategy));
 *
 * This is another version of deflateInit with more compression
 * options. The fields next_in, zalloc, zfree and opaque must be
 * initialized before by the caller.
 *
 * The method parameter is the compression method. It must be
 * Z_DEFLATED in this version of the library. (Method 9 will allow a
 * 64K history buffer and partial block flushes.)
 *
 * The windowBits parameter is the base two logarithm of the window
 * size (the size of the history buffer).  It should be in the range
 * 8..15 for this version of the library (the value 16 will be allowed
 * for method 9). Larger values of this parameter result in better
 * compression at the expense of memory usage. The default value is 15
 * if deflateInit is used instead.
 *
 * The memLevel parameter specifies how much memory should be
 * allocated for the internal compression state. memLevel=1 uses
 * minimum memory but is slow and reduces compression ratio;
 * memLevel=9 uses maximum memory for optimal speed. The default value
 * is 8. See zconf.h for total memory usage as a function of
 * windowBits and memLevel.
 *
 * The strategy parameter is used to tune the compression
 * algorithm. Use the value Z_DEFAULT_STRATEGY for normal data,
 * Z_FILTERED for data produced by a filter (or predictor), or
 * Z_HUFFMAN_ONLY to force Huffman encoding only (no string match).
 * Filtered data consists mostly of small values with a somewhat
 * random distribution. In this case, the compression algorithm is
 * tuned to compress them better. The effect of Z_FILTERED is to force
 * more Huffman coding and less string matching; it is somewhat
 * intermediate between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy
 * parameter only affects the compression ratio but not the
 * correctness of the compressed output even if it is not set
 * appropriately.
 *
 * If next_in is not null, the library will use this buffer to hold
 * also some history information; the buffer must either hold the
 * entire input data, or have at least 1<<(windowBits+1) bytes and be
 * writable. If next_in is null, the library will allocate its own
 * history buffer (and leave next_in null). next_out need not be
 * provided here but must be provided by the application for the next
 * call of deflate().
 *
 * If the history buffer is provided by the application, next_in must
 * must never be changed by the application since the compressor
 * maintains information inside this buffer from call to call; the
 * application must provide more input only by increasing
 * avail_in. next_in is always reset by the library in this case.
 *
 * deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not
 * enough memory, Z_STREAM_ERROR if a parameter is invalid (such as an
 * invalid method). msg is set to null if there is no error message.
 * deflateInit2 does not perform any compression: this will be done by
 * deflate().
 */

ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
    const Bytef *dictionary, uInt dictLength));

/*
 * Initializes the compression dictionary (history buffer) from the
 * given byte sequence without producing any compressed output. This
 * function must be called immediately after deflateInit or
 * deflateInit2, before any call of deflate. The compressor and
 * decompressor must use exactly the same dictionary (see
 * inflateSetDictionary).
 *
 * The dictionary should consist of strings (byte sequences) that are
 * likely to be encountered later in the data to be compressed, with
 * the most commonly used strings preferably put towards the end of
 * the dictionary. Using a dictionary is most useful when the data to
 * be compressed is short and can be predicted with good accuracy; the
 * data can then be compressed better than with the default empty
 * dictionary. In this version of the library, only the last 32K bytes
 * of the dictionary are used.
 *
 * Upon return of this function, strm->adler is set to the Adler32
 * value of the dictionary; the decompressor may later use this value
 * to determine which dictionary has been used by the compressor. (The
 * Adler32 value applies to the whole dictionary even if only a subset
 * of the dictionary is actually used by the compressor.)
 *
 * deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if
 * a parameter is invalid (such as NULL dictionary) or the stream
 * state is inconsistent (for example if deflate has already been
 * called for this stream). deflateSetDictionary does not perform any
 * compression: this will be done by deflate().
 */

ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source));
/*
 * Sets the destination stream as a complete copy of the source
 * stream.  If the source stream is using an application-supplied
 * history buffer, a new buffer is allocated for the destination
 * stream.  The compressed output buffer is always
 * application-supplied. It's the responsibility of the application to
 * provide the correct values of next_out and avail_out for the next
 * call of deflate.
 *
 * This function can be useful when several compression strategies
 * will be tried, for example when there are several ways of
 * pre-processing the input data with a filter. The streams that will
 * be discarded should then be freed by calling deflateEnd.  Note that
 * deflateCopy duplicates the internal compression state which can be
 * quite large, so this strategy is slow and can consume lots of
 * memory.
 *
 * deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
 * enough memory, Z_STREAM_ERROR if the source stream state was
 * inconsistent (such as zalloc being NULL). msg is left unchanged in
 * both source and destination.
 */

ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
/*
 * This function is equivalent to deflateEnd followed by deflateInit,
 * but does not free and reallocate all the internal compression
 * state.  The stream will keep the same compression level and any
 * other attributes that may have been set by deflateInit2.
 *
 * deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the
 * source stream state was inconsistent (such as zalloc or state being
 * NULL).
 */

ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy));
/*
 * Dynamically update the compression level and compression strategy.
 * This can be used to switch between compression and straight copy of
 * the input data, or to switch to a different kind of input data
 * requiring a different strategy. If the compression level is
 * changed, the input available so far is compressed with the old
 * level (and may be flushed); the new level will take effect only at
 * the next call of deflate().
 *
 * Before the call of deflateParams, the stream state must be set as
 * for a call of deflate(), since the currently available input may
 * have to be compressed and flushed. In particular, strm->avail_out
 * must be non-zero.
 *
 * deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
 * stream state was inconsistent or if a parameter was invalid,
 * Z_BUF_ERROR if strm->avail_out was zero.
 */

ZEXTERN int ZEXPORT deflateOutputPending OF((z_streamp strm));
/*
 * Returns the number of bytes of output which are immediately
 * available from the compressor (i.e. without any further input or
 * flush).
 */

/*
 * ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
 *                                    int  windowBits));
 *
 * This is another version of inflateInit with more compression
 * options. The fields next_out, zalloc, zfree and opaque must be
 * initialized before by the caller.
 *
 * The windowBits parameter is the base two logarithm of the maximum
 * window size (the size of the history buffer).  It should be in the
 * range 8..15 for this version of the library (the value 16 will be
 * allowed soon). The default value is 15 if inflateInit is used
 * instead. If a compressed stream with a larger window size is given
 * as input, inflate() will return with the error code Z_DATA_ERROR
 * instead of trying to allocate a larger window.
 *
 * If next_out is not null, the library will use this buffer for the
 * history buffer; the buffer must either be large enough to hold the
 * entire output data, or have at least 1<<windowBits bytes.  If
 * next_out is null, the library will allocate its own buffer (and
 * leave next_out null). next_in need not be provided here but must be
 * provided by the application for the next call of inflate().
 *
 * If the history buffer is provided by the application, next_out must
 * never be changed by the application since the decompressor
 * maintains history information inside this buffer from call to call;
 * the application can only reset next_out to the beginning of the
 * history buffer when avail_out is zero and all output has been
 * consumed.
 *
 * inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not
 * enough memory, Z_STREAM_ERROR if a parameter is invalid (such as
 * windowBits < 8). msg is set to null if there is no error message.
 * inflateInit2 does not perform any decompression: this will be done
 * by inflate().
 */

ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
    const Bytef *dictionary, uInt dictLength));

/*
 * Initializes the decompression dictionary (history buffer) from the
 * given uncompressed byte sequence. This function must be called
 * immediately after a call of inflate if this call returned
 * Z_NEED_DICT. The dictionary chosen by the compressor can be
 * determined from the Adler32 value returned by this call of
 * inflate. The compressor and decompressor must use exactly the same
 * dictionary (see deflateSetDictionary).
 *
 * inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
 * parameter is invalid (such as NULL dictionary) or the stream state
 * is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match
 * the expected one (incorrect Adler32 value). inflateSetDictionary
 * does not perform any decompression: this will be done by subsequent
 * calls of inflate().
 */

ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
/*
 * Skips invalid compressed data until the special marker (see
 * deflate() above) can be found, or until all available input is
 * skipped. No output is provided.
 *
 * inflateSync returns Z_OK if the special marker has been found,
 * Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no
 * marker has been found, or Z_STREAM_ERROR if the stream structure
 * was inconsistent. In the success case, the application may save the
 * current current value of total_in which indicates where valid
 * compressed data was found. In the error case, the application may
 * repeatedly call inflateSync, providing more input each time, until
 * success or end of the input data.
 */

ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
/*
 * This function is equivalent to inflateEnd followed by inflateInit,
 * but does not free and reallocate all the internal decompression
 * state.  The stream will keep attributes that may have been set by
 * inflateInit2.
 *
 * inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the
 * source stream state was inconsistent (such as zalloc or state being
 * NULL).
 */

ZEXTERN int inflateIncomp OF((z_stream *strm));
/*
 * This function adds the data at next_in (avail_in bytes) to the
 * output history without performing any output.  There must be no
 * pending output, and the decompressor must be expecting to see the
 * start of a block.  Calling this function is equivalent to
 * decompressing a stored block containing the data at next_in (except
 * that the data is not output).
 */

			/* utility functions */

/*
 * The following utility functions are implemented on top of the basic
 * stream-oriented functions. To simplify the interface, some default
 * options are assumed (compression level, window size, standard
 * memory allocation functions). The source code of these utility
 * functions can easily be modified if you need special options.
 */

/*
 * ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
 * const Bytef *source, uLong sourceLen));
 */

/*
 * Compresses the source buffer into the destination buffer.
 * sourceLen is the byte length of the source buffer. Upon entry,
 * destLen is the total size of the destination buffer, which must be
 * at least 0.1% larger than sourceLen plus 12 bytes. Upon exit,
 * destLen is the actual size of the compressed buffer.
 *
 * This function can be used to compress a whole file at once if the
 * input file is mmap'ed.
 *
 * compress returns Z_OK if success, Z_MEM_ERROR if there was not
 * enough memory, Z_BUF_ERROR if there was not enough room in the
 * output buffer.
 */

/*
 * ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
 * const Bytef *source, uLong sourceLen));
 */

/*
 * Decompresses the source buffer into the destination buffer.
 * sourceLen is the byte length of the source buffer. Upon entry,
 * destLen is the total size of the destination buffer, which must be
 * large enough to hold the entire uncompressed data. (The size of the
 * uncompressed data must have been saved previously by the compressor
 * and transmitted to the decompressor by some mechanism outside the
 * scope of this compression library.)  Upon exit, destLen is the
 * actual size of the compressed buffer.
 *
 * This function can be used to decompress a whole file at once if the
 * input file is mmap'ed.
 *
 * uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
 * enough memory, Z_BUF_ERROR if there was not enough room in the
 * output buffer, or Z_DATA_ERROR if the input data was corrupted.
 */


typedef voidp gzFile;

/* ZEXTERN gzFile ZEXPORT gzopen  OF((const char *path, const char *mode)); */
/*
 * Opens a gzip (.gz) file for reading or writing. The mode parameter
 * is as in fopen ("rb" or "wb") but can also include a compression
 * level ("wb9").  gzopen can be used to read a file which is not in
 * gzip format; in this case gzread will directly read from the file
 * without decompression.
 *
 * gzopen returns NULL if the file could not be opened or if there was
 * insufficient memory to allocate the (de)compression state; errno
 * can be checked to distinguish the two cases (if errno is zero, the
 * zlib error is Z_MEM_ERROR).
 */

/* ZEXTERN gzFile ZEXPORT gzdopen  OF((int fd, const char *mode)); */
/*
 * gzdopen() associates a gzFile with the file descriptor fd.  File
 * descriptors are obtained from calls like open, dup, creat, pipe or
 * fileno (in the file has been previously opened with fopen).  The
 * mode parameter is as in gzopen.
 *
 * The next call of gzclose on the returned gzFile will also close the
 * file descriptor fd, just like fclose(fdopen(fd), mode) closes the
 * file descriptor fd. If you want to keep fd open, use
 * gzdopen(dup(fd), mode).
 *
 * gzdopen returns NULL if there was insufficient memory to allocate
 * the (de)compression state.
 */

/* ZEXTERN int ZEXPORT    gzread  OF((gzFile file, voidp buf, unsigned len)); */
/*
 * Reads the given number of uncompressed bytes from the compressed
 * file.  If the input file was not in gzip format, gzread copies the
 * given number of bytes into the buffer.
 *
 * gzread returns the number of uncompressed bytes actually read (0
 * for end of file, -1 for error).
 */

/*
 *  ZEXTERN int ZEXPORT gzwrite OF((gzFile file, const voidp buf,
 *  unsigned len));
 */
/*
 * Writes the given number of uncompressed bytes into the compressed
 * file.  gzwrite returns the number of uncompressed bytes actually
 * written (0 in case of error).
 */

/* ZEXTERN int ZEXPORT    gzflush OF((gzFile file, int flush)); */
/*
 * Flushes all pending output into the compressed file. The parameter
 * flush is as in the deflate() function. The return value is the zlib
 * error number (see function gzerror below). gzflush returns Z_OK if
 * the flush parameter is Z_FINISH and all output could be flushed.
 *
 * gzflush should be called only when strictly necessary because it
 * can degrade compression.
 */

/* ZEXTERN int ZEXPORT    gzclose OF((gzFile file)); */
/*
 * Flushes all pending output if necessary, closes the compressed file
 * and deallocates all the (de)compression state. The return value is
 * the zlib error number (see function gzerror below).
 */

/* ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); */
/*
 * Returns the error message for the last error which occurred on the
 * given compressed file. errnum is set to zlib error number. If an
 * error occurred in the file system and not in the compression
 * library, errnum is set to Z_ERRNO and the application may consult
 * errno to get the exact error code.
 */

			/* checksum functions */

/*
 * These functions are not related to compression but are exported
 * anyway because they might be useful in applications using the
 * compression library.
 */

ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));

/*
 * Update a running Adler-32 checksum with the bytes buf[0..len-1] and
 * return the updated checksum. If buf is NULL, this function returns
 * the required initial value for the checksum.  An Adler-32 checksum
 * is almost as reliable as a CRC32 but can be computed much
 * faster. Usage example:
 *
 *	uLong adler = adler32(0L, Z_NULL, 0);
 *
 *	while (read_buffer(buffer, length) != EOF) {
 *		adler = adler32(adler, buffer, length);
 *	}
 *	if (adler != original_adler) error();
 */

/* ZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len)); */
/*
 * Update a running crc with the bytes buf[0..len-1] and return the
 * updated crc. If buf is NULL, this function returns the required
 * initial value for the crc. Pre- and post-conditioning (one's
 * complement) is performed within this function so it shouldn't be
 * done by the application.  Usage example:
 *
 *	uLong crc = crc32(0L, Z_NULL, 0);
 *
 *	while (read_buffer(buffer, length) != EOF) {
 *		crc = crc32(crc, buffer, length);
 *	}
 *	if (crc != original_crc) error();
 */


			/* various hacks, don't look :) */

/*
 * deflateInit and inflateInit are macros to allow checking the zlib version
 * and the compiler's view of z_stream:
 */
ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
    const char *version, int stream_size));
ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
    const char *version, int stream_size));
ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,
    int windowBits, int memLevel, int strategy,
    const char *version, int stream_size));
ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,
    const char *version, int stream_size));
#define	deflateInit(strm, level) \
	deflateInit_((strm), (level), ZLIB_VERSION, sizeof (z_stream))
#define	inflateInit(strm) \
	inflateInit_((strm), ZLIB_VERSION, sizeof (z_stream))
#define	deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
	deflateInit2_((strm), (level), (method), (windowBits), (memLevel), \
		(strategy), ZLIB_VERSION, sizeof (z_stream))
#define	inflateInit2(strm, windowBits) \
	inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof (z_stream))

#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
	struct internal_state {int dummy; }; /* hack for buggy compilers */
#endif

/*
 * uLongf *get_crc_table OF((void)); * can be used by asm versions of
 * crc32()
 */

#ifdef __cplusplus
}
#endif

#endif /* _ZLIB_H */
